/***********************************************************************************************//**
*\n  @file       commucationIF.h
*\n  @brief      uds诊断协议
*\n  @details
*\n -----------------------------------------------------------------------------------
*\n  文件说明：
*\n       1. uds诊断协议
*\n
*\n -----------------------------------------------------------------------------------
*\n  版本:   	修改人:       修改日期:        	描述:
*\n  V0.01  项目组        2020.3.17          创建
*\n
***************************************************************************************************/
#ifndef _UDS_841CF7CF_E2B5_41FB_1111_52E4EF23B8EC_
#define _UDS_841CF7CF_E2B5_41FB_1111_52E4EF23B8EC_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**************************************************************************************************
* 头文件
***************************************************************************************************/


/**************************************************************************************************
* 宏定义、结构定义
***************************************************************************************************/
#define   API    	 /*API接口标志*/
#define SIG_IVALID  			0x7FFFFFFF
#define   SIZE_OF_UDS_FRAME_HEAD   6   /* UDS帧头长度 */

typedef struct  object_t
{
	int id;         /* 障碍物ID, 0~15. 跟踪障碍物时, ID保持不变 */
	int obj_class;  /* 障碍物类型
		            *  0: car
			     	*  1: truck
			     	*  2: ped
		            *  3: motocycle
			     *  4: bicycle
			     *  5: animal
			     *  6: minecar
			     *  7: engineeringtruck
			     *  8: res
		             */
	float obj_x;       /* 横坐标, 右边为正轴. 单位: m, 范围: -40.96m ~ 40.96m */
	float obj_y;       /* 纵坐标, 单位: m, 范围: 0 ~ 160m */
	float obj_x_vrel;  /* x轴相对速度分量. 单位: m/s,  范围: -51.2m/s ~ 51.1m/s */
	float obj_y_vrel;  /* y轴相对速度分量. 单位: m/s,  范围: -128m/s ~ 128m/s */
	float obj_width;   /* 障碍物宽度. 单位: m, 范围: 0 ~ 6.4m */
	float obj_y_arel;  /* y轴相对加速度分量. 单位: m/s2,  范围: -128m/s2 ~ 128m/s2*/

	int   obj_det_prop; /* detection property of the object indicating if the object is fused or  come from radar (camera)
	                     * 0:undefined
                         * 1:sole-radar
                         * 2:sole-camera
                         * 3:fused
	                     */
	int   obj_exist_prop; /* Probability of existence
	                       * 0: =25%
                           * 1: =50%
                           * 2: =75%
                           * 3: =99%
	                       */
	int   obj_dyn_prop; /* Dynamic property of the object indicating if the object is moving or stationary
	                     * 0:unclassified
						 * 1:standing
						 * 2:stopped
						 * 3:moving
						 * 4:oncoming
	                     */
	int   obj_lane;     /* 目标与当前车道的关系
	                     * 0:undefined
						 * 1:same lane
						 * 2:left lane
						 * 3:right lane
                         */
} __object_t;



/* x = c3*y^3 + c2*y^2 + c1*y + c0 */
typedef struct lane_t
{
	int   valid; /* 车道线是否有效, 0=无效, 1=有效 */
	int   id;    /* 如果是左/右车道线, 忽略ID, 如果是额外的车道线, 表示车道线ID (0~7) */
	int   quality; /* 0,1: low quality.  2,3: high quality */
	int   type;    /* 0:dashed  1:solid */
	int   view_range_valid; /* 纵向范围是否有效, 0=无效, 1=有效 */
	float view_range;       /* 纵向范围: 0~127.0 m */
	float c0;
	float c1;
	float c2;
	float c3;
	float mark_width;
} __lane_t;



#define OUT_OBJS   10
#define NEXT_LANES 7
typedef struct obj_lane_t
{
	int valid;  		/* 数据是否有效, 0:无效, 1:有效 */
	int device_status; /* 设备工作状态,
	                      0: normal
                          1: radar abnormal
                          2: camera abnormal
                          3: both abnormal
                        */
	int  drive_status;  /* 驾驶状态， 0：在道路中间行驶， 1：正在变向左边的车道， 2：正在变向右边的车道 */
	int  objs;   /* 目标个数, 0~10 */
	__object_t object[OUT_OBJS];
	__lane_t leftlane;
	__lane_t rightlane;
	int  nextlane_num;  /* 额外车道线个数 */
	__lane_t nextlane[NEXT_LANES];
} obj_lane_t;


#if 0
typedef struct
{
	int  fcw_level;   /* 前车碰撞预警级别, 0:无预警, 1:预碰撞预警, 2:碰撞预警 */
	int  hmw_level;   /* 车距监测预警级别, 0:未检测到前车, 1:检测到前车且无预警, 2:一级车距监测预警, 3:二级车距监测预警 */
	int  ldw;         /* 车道偏离预警, 0:无预警, 1:左车道偏离预警, 2:右车道偏离预警 */
	int  headway;     /* 车头时距, 单位:0.1s/bit, 范围:0-9.9s, 时距无效时该值为 -1 */
	int  ttc;         /* 相对碰撞时间, 单位:0.001s/bit, 范围:0-100s, ttc无效时值为-1 */
	int  ldw_on;      /* LDW开关, 0:关闭LDW, 1:开启LDW */
	int  car_on;      /* 车辆检测开关, 0:停止检测前车, 1:开启前车相关的预警 */
	int  ufcw;        /* 溜车预警, 0:无预警, 1:预警 */
	int  car_follow;  /* 跟车提醒, 0:无跟车提醒, 1:有跟车提醒 */
	int  drive_status; /* 驾驶状态， 0：在道路中间行驶， 1：正在变向左边的车道， 2：正在变向右边的车道 */
	int  left_lane;    /* 左车道线检测状态， 0：未检测到左车道线， 1：检测到左车道线 */
	int  right_lane;   /* 右车道线检测状态， 0：未检测到右车道线， 1：检测到右车道线 */
	int  front_distance;  /* 前车距离, 单位：0.01m/bit， 范围：0-200m, 距离无效时值为-1 */
	int  front_speed;     /* 前车相对速度, -500Km/h ~ 500Km/h , 单位: 1/128kmph/bit, 前车距离无效时该值为0 */
	int  speed_limit;     /* 限速牌, 0: 无限速牌, >0:表示限速值,单位km/h, -1:表示解除所有限速, 其他负数表示解除的限速值 */
	int  ped;             /* 行人检测(纵向距离), 单位:0.01m/bit, 范围:0.01-150m, 未检测到行人时该值为 0 */
	int  ped_x;           /* 行人检测(横向距离), 单位:0.01m/bit, 范围:-64-64m, ped=0时该值无效 */
	int  pcw_level;       /* 行人碰撞预警级别, 0:无预警, 1:一级碰撞预警, 2:二级碰撞预警, 3:行人紧急制动 */
	int  pcw_brake;       /* 行人制动级别, 0=无制动, 1=一级制动, 2=二级制动 */
	int  pcw_on;          /* PCW开关, 0：off, 1:on */
	int  hmw_on;          /* HWM开关, 0：off, 1:on */
	int  sli_on;          /* 限速标志识别系统SLI开关, 0：off, 1:on */
	int  aeb_on;          /* AEBS状态, 0=关闭, 1=开启 */
	int  dec_req;         /* 减速请求, 0:无减速请求, 1:减速请求 */
	int  deceleration;    /* 目标减速度, -40m/s2 ~ 40m/s2 , 单位: 1/2048m/s2/bit*/
	int  res[4];
} alarm_info_t;

#else

typedef struct {
	int  fcw_level;   /* 前车碰撞预警级别, 0:无预警, 1:预碰撞预警, 2:碰撞预警 */
	int  hmw_level;   /* 车距监测预警级别, 0:未检测到前车, 1:检测到前车且无预警, 2:一级车距监测预警, 3:二级车距监测预警 */
	int  ldw;         /* 车道偏离预警, 0:无预警, 1:左车道偏离预警, 2:右车道偏离预警 */
	int  headway;     /* 车头时距, 单位:0.1s/bit, 范围:0-9.9s, 时距无效时该值为 -1 */
	int  ttc;         /* 相对碰撞时间, 单位:0.001s/bit, 范围:0-100s, ttc无效时值为-1 */
	int  ldw_on;      /* LDW开关, 0:关闭LDW, 1:开启LDW */
	int  car_on;      /* 车辆检测开关, 0:停止检测前车, 1:开启前车相关的预警 */
	int  ufcw;        /* 溜车预警, 0:无预警, 1:预警 */
	int  car_follow;  /* 跟车提醒, 0:无跟车提醒, 1:有跟车提醒 */
	int  drive_status; /* 驾驶状态， 0：在道路中间行驶， 1：正在变向左边的车道， 2：正在变向右边的车道 */
	int  left_lane;    /* 左车道线检测状态， 0：未检测到左车道线， 1：检测到左车道线 */
	int  right_lane;   /* 右车道线检测状态， 0：未检测到右车道线， 1：检测到右车道线 */
	int  front_distance;  /* 前车距离, 单位：0.01m/bit， 范围：0-200m, 距离无效时值为-1 */
	int  front_speed;     /* 前车相对速度, -500Km/h ~ 500Km/h , 单位: 1/128kmph/bit, 前车距离无效时该值为0 */
	int  speed_limit;     /* 限速牌, 0: 无限速牌, >0:表示限速值,单位km/h, -1:表示解除所有限速, 其他负数表示解除的限速值 */
	int  ped;             /* 行人检测(纵向距离), 单位:0.01m/bit, 范围:0.01-150m, 未检测到行人时该值为 0 */
	int  ped_x;           /* 行人检测(横向距离), 单位:0.01m/bit, 范围:-64-64m, ped=0时该值无效 */
	int  pcw_level;       /* 行人碰撞预警级别, 0:无预警, 1:一级碰撞预警, 2:二级碰撞预警, 3:行人紧急制动 */
	int  pcw_brake;       /* 行人制动级别, 0=无制动, 1=一级制动, 2=二级制动 */
	int  pcw_on;          /* PCW开关, 0：off, 1:on */
	int  hmw_on;          /* HWM开关, 0：off, 1:on */
	int  sli_on;          /* 限速标志识别系统SLI开关, 0：off, 1:on */
	int  aeb_on;          /* AEBS状态, 0=关闭, 1=开启 */
	int  dec_req;         /* 减速请求, 0:无减速请求, 1:减速请求 */
	int  deceleration;    /* 目标减速度, -40m/s2 ~ 40m/s2 , 单位: 1/2048m/s2/bit*/
	int  error;		  	  /* 故障码，bit=0 无故障 bit=1故障发生；bit0故障优先级最高bit31故障优先级最低
						  	  bit0,	//预留
							  bit1,	//FPGA初始化失败
							  bit2,	//系统初始化失败
							  bit3,	//摄像头标定失败
							  bit4,	//摄像头无图片
							  bit5,	//摄像头遮挡
							  bit6,	//can-车通信失败
							  bit7,	//can-雷达通信失败败
							  bit8,	//LDW功能关闭
							  bit9,	//LDW车道线检测错误
							  bit10,	//LDW预警故障
							  bit11,	//PCW功能关闭
							  bit12,	//FCW功能关闭
							  bit13,	//FCW预警故障
							  bit14,	//车距监测系统的故障
							  bit15~bit31,预留
						 */
	/* 应用程序不需要设置以下汽车信号值 */
	int  speed;           /* 本车车速, 0-500Km/h, 单位: 1/128kmph/bit */	
	int  obj_class;  /*正前方障碍物类型 
			    * -1:no object
		            *  0: car
			     *  1: truck
			     *  2: ped
		            *  3: motocycle
			     *  4: bicycle
			     *  5: animal
			     *  6: res
		             */
	int  systemstatus;          /* 系统状态, 0:系统正在初始化, 1:系统正在自检,2:系统正常运行  ,无效值：-1 */
	int  brake;           /* 刹车状态, 0:未刹车, 1:已刹车, 无效值：-1 */
	int  left_light;      /* 左转向灯状态, 0:熄灭, 1:闪烁, 无效值：-1 */
	int  right_light;     /* 右转向灯状态, 0:熄灭, 1:闪烁, 无效值：-1 */
	int  reverse;         /* 是否倒车， 0：未倒车， 1：倒车, 无效值：-1 */
	int  neutralgear;	/* 是否空档， 0：非空挡， 1：空挡, 无效值：-1 */
	int  res[16];
}adas_out_t;	
#endif

#if 0
typedef struct input_signal_t
{
	int speed;			/* 车速,单位: 1/128kmph/bit, 物理范围：0-256Km/h, 无效值：-1 */
	int left_light;		/* 左转向, 0:无转向, 1:左转向 ,无效值：-1 */
	int right_light;	/* 右转向, 0:无转向, 1:右转向,无效值：-1 */
	int brake;			/* 刹车状态, 0:未刹车, 1:已刹车, 无效值：-1 */
	int reverse;        /* 是否倒车， 0：未倒车， 1：倒车, 无效值：-1 */
	int ldw_on;			/* LDW开关, 0:关闭, 1:打开, 无效值：-1 */
	int fcw_on;			/* FCW开关, 0:关闭, 1:打开, 无效值：-1 */
	int pcw_on;		    /* PCW开关, 0:关闭, 1:打开, 无效值：-1 */
	int hmw_on;		    /* HMW开关, 0:关闭, 1:打开, 无效值：-1 */
	int steering_angle;	/* 转向角度， 正值表示向左，负值表示向右,  单位: 0.1deg,物理范围：-800deg ～ 800deg， 无效值：0 */
	int yaw_rate;		/* 横摆角速度,单位: 0.01deg/s, 物理范围：-360deg/s ~ 360deg/s, 无效值：0 */
	int res[4];
} input_signal_t;

#else
	
typedef struct {
	int speed;           /* 车速,单位: 1/128kmph/bit, 物理范围：0-500Km/h, 无效值：-1 */
	int brake;           /* 刹车状态, 0:未刹车, 1:已刹车, 无效值：-1 */
	int brake_pos;       /* 刹车开度,单位: 0.1%, 物理范围：0-100%, 无效值：-1 */
	int reverse;         /* 是否倒车， 0：未倒车， 1：倒车, 无效值：-1 */
	int left_light;      /* 左转向灯状态, 0:熄灭, 1:闪烁, 无效值：-1 */
	int right_light;     /* 右转向灯状态, 0:熄灭, 1:闪烁, 无效值：-1 */
	int steering_angle;  /* 转向角度， 正值表示向左，负值表示向右, 单位: 0.1deg，物理范围：-800deg ～ 800deg， 无效值：SIG_IVALID */
	int steering_speed;  /* 转向角速度, 单位: 1deg/s，物理范围：0~2000deg/s， 无效值：-1 */
	int ldw_on;          /* LDW开关, 0：off, 1:on, 无效值：-1 */
	int fcw_on;          /* FCW开关, 0：off, 1:on, 无效值：-1 */
	int low_beam;        /* 近光灯状态， 0：熄灭， 1：点亮, 无效值：-1 */
	int high_beam;       /* 远光灯状态， 0：熄灭， 1：点亮, 无效值：-1 */
	int front_wiper;     /* 前雨刮器工作状态， 0：不工作， 1：低档， 2：中档， 3：高档， 4：间歇档, 无效值：-1 */
	int yaw_rate;        /* 横摆角速度, 单位: 0.01deg/s, 物理范围：-360deg/s ~ 360deg/s, 无效值：SIG_IVALID */
	int standstill;      /* 车辆是否静止, 0:非静止, 1:静止, 无效值: -1 */
	int pcw_on;          /* PCW开关, 0：off, 1:on, 无效值：-1 */
	int hmw_on;          /* HWM开关, 0：off, 1:on, 无效值：-1 */
	int sli_on;          /* SLI开关, 0：off, 1:on, 无效值：-1 */
	int aeb_on;          /* aeb开关, 0：off, 1:on, 无效值：-1 */
	int dbg_cmd;         /* 调试命令, 无效值：-1 */
	int ext_warn;        /* 外部预警, 0=无预警, 1=一级预警, 2=二级预警, 
	                        3=紧急制动, -1表示外部预警信息无效,使用内部预警信息 */
	int ext_obj;         /* 外部设备检测到目标, 0=未检测到目标, 1=检测到目标, -1表示无外部设备 */
	int neutralgear;	 /* 是否空档， 0：非空挡， 1：空挡, 无效值：-1 */
	int turnlight;
	int gear;			 /* 档位状态, 0:空挡, 1:前进挡, 2:后退档,  无效值：-1 */
	int res[14];
} signal_t;

#endif

#define	DATADID_MAXNUM					32/*DID最大数量*/
#define	DID_MAX_DATALEN					128/*每个DID数据最大长度*/
#define	DID_SOFTWARENUM					(0x0001)/*摄像头软件版本号*/
#define	DID_SERIALNUM						(0x0002)/*摄像头SN序列号*/
#define	DID_CAMERAHEIGHT					(0x0003)
#define	DID_CAMERALEFTEDGE					(0x0004)
#define	DID_CAMERARIGHTEDGE				(0x0005)
#define	DID_CAMERAFRONTEDGE				(0x0006)
#define	DID_RADARTYPE						(0x0007)
#define	DID_LDWMINSPEED					(0x0008)
#define	DID_HDWMINSPEED					(0x0009)
#define	DID_LEVEONEMINTTC					(0x000A)
#define	DID_LEVETWOMINTTC					(0x000B)
#define	DID_EMERGENCYMINTTC				(0x000C)
#define	DID_CAMERACALIBPARAM				(0xF0B0)/*摄像头标定参数，用于摄像头标定*/
#define	DID_IOINPUTSIGNAL					(0xF0B1)/*IO控制输入信号*/
#define	DID_RADARCALIBPARAM				(0xF0B2)/*雷达标定参数，用于雷达标定*/
#define	DID_CAMERARESULTPARAM			(0xF0B3)/*摄像头标定结果状态参数，用于初始化客户端状态*/
#define	DID_RADARRESULTPARAM				(0xF0B4)/*雷达标定结果状态参数，用于初始化客户端状态*/
#define	DID_FUSEDRESULTPARAM				(0xF0B5)/*标定融合结果状态参数，用于初始化客户端状态*/
#define	DID_RADARSOFTWARENUM				(0xF0B6)/*雷达软件版本号*/
#define	DID_RADARSERIALNUM				(0xF0B7)/*雷达SN序列号*/


typedef enum EcuResetType{
	HARD_RESET = 1,/*硬件复位*/
	SOFT_RESET = 2,/*软件复位*/
}EcuResetType;

typedef enum RoutineControlResult{
	RESULT_INCORRECT =0x00,
	RESULT_CORRECT =0x01,
} RoutineControlResult;

#ifndef bool
typedef enum bool{
	false = 0x00,
	true  = 0x01,
} bool;
#endif

typedef struct output_signal_t
{
	obj_lane_t objinfo;
//	alarm_info_t alarminfo;
	adas_out_t alarminfo;
} output_signal_t;




/*
* 功能:重启系统
* 参数:	
*return: 	TURE	成
		FALSE	失败
*说明:
*/
typedef bool (*cbEcuReset)(EcuResetType type);

/*
* 功能: 检查编程预条件(确保执行重编程时车辆及自身系统处于安全状态)
* 参数:	
*return: 	RESULT_CORRECT		编程预条件满足
		RESULT_INCORRECT	编程预条件不满足
*说明:   用于摄像头升级预编程条件检查，并设置摄像头升级标志
*/
typedef RoutineControlResult (*cbCheckProgramPrecondition)(void);

/*
* 功能: 启动摄像头标定
* 参数:	
*return: 	RESULT_CORRECT		启动成功
		RESULT_INCORRECT	启动失败
*/
typedef RoutineControlResult (*cbStartCameraCalibrate)(void);
/*
* 功能: 检查摄像头标定结果
* 参数:	result		输出参数，返回标定结果FALSE-标定失败TRUE-标定成功
		buf		输出参数，返回标定结果参数,数据填充格式参照标定规范
		datalen	输出参数，返回标定结果参数长度
		buflen	输入参数，buf最大长度
*return: 	RESULT_CORRECT		标定结束
		RESULT_INCORRECT	正在标定
*/
typedef RoutineControlResult (*cbCheckCameraCalibrateResult)(bool *result, uint8_t *buf, uint16_t buflen, uint8_t *datalen);
/*
* 功能: 启动雷达标定
* 参数:	
*return: 	RESULT_CORRECT		启动成功
		RESULT_INCORRECT	启动失败
*/
typedef RoutineControlResult (*cbStartRadarCalibrate)(void);
/*
* 功能: 检查雷达标定结果
* 参数:	result		输出参数，FALSE-标定失败TRUE-标定成功
*return: 	RESULT_CORRECT		标定结束
		RESULT_INCORRECT	正在标定
*/
typedef RoutineControlResult (*cbCheckRadarCalibrateResult)(bool *result);
/*
* 功能: 更新摄像头标定参数到flash
* 参数:	
*return: 	RESULT_CORRECT		启动成功
		RESULT_INCORRECT	启动失败
*/
typedef RoutineControlResult (*cbUpdateCamCalibrateParam)(void);
/*
* 功能: 查询摄像头标定参数更新flash结果
* 参数:	result		输出参数，FALSE-更新失败TRUE-更新成功
*return: 	RESULT_CORRECT		更新结束
		RESULT_INCORRECT	正在更新
*/
typedef RoutineControlResult (*cbCheckCamCalibUpdate)(bool *result);
/*
* 功能: 更新雷达标定参数到flash
* 参数:	
*return: 	RESULT_CORRECT		启动成功
		RESULT_INCORRECT	启动失败
*/
typedef RoutineControlResult (*cbUpdateRadarCalibrateParam)(void);
/*
* 功能: 查询雷达标定参数更新flash结果
* 参数:	result		输出参数，FALSE-更新失败TRUE-更新成功
*return: 	RESULT_CORRECT		更新结束
		RESULT_INCORRECT	正在更新
*/
typedef RoutineControlResult (*cbCheckRadarCalibUpdate)(bool *result);

/*
* 功能: 开始进行标定结果性能验证(融合测试)
* 参数:	
*return: 	RESULT_CORRECT		启动成功
		RESULT_INCORRECT	启动失败
*/
typedef RoutineControlResult (*cbStartCalibResultValid)(void);
/*
* 功能: 查询标定性能验证结果
* 参数:	result		输出参数，FALSE-融合失败TRUE-融合成功
		buf		输出参数，返回融合结果参数,数据填充格式参照标定规范
		datalen	输出参数，返回融合结果参数长度
		buflen	输入参数，buf最大长度
*return: 	RESULT_CORRECT		验证结束
		RESULT_INCORRECT	正在验证
*/
typedef RoutineControlResult (*cbCheckCalibResultValidResult)(bool *result, uint8_t *buf, uint16_t buflen, uint8_t *datalen);

/*
* 功能: 结束标定
* 参数:	
*return: 	RESULT_CORRECT		结束标定成功
		RESULT_INCORRECT	结束标定失败
*/
typedef RoutineControlResult (*cbStopCalibrate)(void);
/*
* 功能: 升级请求(非阻塞)
* 参数:	
*return: 	0	操作成功
		-1	操作失败
*说明 :该接口实现应用向BootLoader进程发送升级请求命令
*/
typedef int (*cbProgramRequest)(void);
/*
* 功能: 开始进行升级(非阻塞)
* 参数:	
*return: 	0	操作成功
		-1	操作失败
*说明 :该接口实现应用开始释放资源并退出自身进程用于CAN升级应用
*/
typedef int (*cbProgramStart)(void);

/*
* 功能: 设置摄像头标定参数
* 参数::buf		输入标定参数数据
		  buflen	标定参数长度	
*return: 	0	操作成功
		-1	操作失败
*说明 :
*/
typedef int (*cbSetCamCalibParam)(uint8_t *buf, uint8_t buflen);
/*
* 功能: 设置雷达标定参数
* 参数:buf		输入标定参数数据
		 buflen	标定参数长度
*return: 	0	操作成功
		-1	操作失败
*说明 :
*/
typedef int (*cbSetRadarCalibParam)(uint8_t *buf, uint8_t buflen);

// 回调函数列表
typedef struct st_diagparam{
	cbEcuReset EcuReset;
	cbCheckProgramPrecondition CheckProgramPrecondition;
	cbStartCameraCalibrate StartCameraCalibrate;
	cbCheckCameraCalibrateResult CheckCameraCalibrateResult;
	cbStartRadarCalibrate StartRadarCalibrate;
	cbCheckRadarCalibrateResult CheckRadarCalibrateResult;
	cbUpdateCamCalibrateParam UpdateCamCalibrateParam;
	cbCheckCamCalibUpdate CheckCamCalibUpdate;
	cbUpdateRadarCalibrateParam UpdateRadarCalibrateParam;
	cbCheckRadarCalibUpdate CheckRadarCalibUpdate;
	cbStartCalibResultValid StartCalibResultValid;
	cbCheckCalibResultValidResult CheckCalibResultValidResult;
	cbStopCalibrate StopCalibrate;
	cbProgramRequest ProgramRequest;
	cbProgramStart ProgramStart;

	/*MCU更新DID数据到FPGA实现通过回调接口*/
	cbSetCamCalibParam SetCamCalibParam;
	cbSetRadarCalibParam SetRadarCalibParam;
} udsrequest_t;


/***********************************************
	objinfo[0]:系统异常
			bit0 - FPGA始化失败
			bit1 - 系统异常
			bit2 - 系统未标定
			bit3~bit31:reserve
	objinfo[1]:camera异常
			bit0 - camera标定异常
			bit1 - camera没有图片
			bit2 - camera被遮挡
			bit3~bit31:reserve
	objinfo[2]:通信异常
			bit0 - can通信故障
			bit1 - 雷达故障
			bit2~bit31:reserve
	objinfo[3]:算法功能异常
			bit0 - ldw使能故障
			bit1 - ldw车道线检测故障
			bit2 - ldw车道偏离预警故障
			bit3 - pcw故障
			bit4 - fcw使能故障
			bit5 - fcw预警故障
			bit6~bit31:reserve
************************************************/
typedef struct udsdtc_t
{
	uint32_t dtc[4];
} udsdtc_t;

typedef struct  udsdidnode_t
{
	uint16_t DID;/*发生变化的DID*/
	uint8_t *data;/*发生变化的DID数据*/
} udsdidnode_t;


typedef struct udsdid_t
{
	udsdidnode_t *dids;
	uint32_t num;/*发生变化的DID数量*/
} udsdid_t;



// 初始化
API int spi_init(/* udsrequest_t *udscbfunc */);  
API int spi_uninit(void);

API int spi_get_inputsignal(signal_t *in);

/*
* 功能: 算法应用与底层通信数据交互接口
* 参数:[out]sig		报警信息、障碍物信息、车道线信息额等，由算法填充
		 [in]adas		车身输入信号
		 [in]dtcinfo	故障信息，故障发生对应的bit置1，未发生置0
		 				故障bit map标见udsdtc_t说明
		 [in]updatedid	用于did数据变化更新同步到MCU
		 				FPGA更新DID数据到MCU通过该参数实现
		 				eg:FPGA 软件版本号变化需要同步到MCU
* 返回:0	表示调用成功
		-1	err1
		-2	err2
* 说明:该接口由应用根据算法周期进行周期调用
*/
//API int spi_set_outputsignal(output_signal_t *out /* , udsdtc_t *dtcinfo, udsdid_t *updatedid */);
API int spi_set_outputsignal(adas_out_t *ptAlarminfo, obj_lane_t *ptObjinfo);

API int spi_set_dtc(udsdtc_t *dtcinfo, udsdid_t *updatedid);

#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _UDS_841CF7CF_E2B5_41FB_1111_52E4EF23B8EC_ */





